# 如何创建和查询向量存储

:::info

请前往[集成](/docs/integrations/vectorstores/)，查看与第三方向量存储的内置集成文档。

:::

存储和搜索非结构化数据的最常见方式之一是将其嵌入并存储生成的嵌入向量，然后在查询时对非结构化查询进行嵌入，并检索与嵌入查询“最相似”的嵌入向量。向量存储负责存储嵌入数据并为您执行向量搜索。

## 入门

本指南展示了与向量存储相关的基本功能。与向量存储一起工作的关键部分是创建要放入其中的向量，通常是通过嵌入创建的。因此，建议您在深入研究本文之前先熟悉[文本嵌入模型接口](/docs/how_to/embed_text)。

在使用向量存储之前，我们需要加载一些数据并初始化一个嵌入模型。

我们想要使用 OpenAIEmbeddings，因此我们需要获取 OpenAI API 密钥。

```python
import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
```

```python
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
# 加载文档，将其分割成块，对每个块进行嵌入，然后将其加载到向量存储中。
raw_documents = TextLoader('state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
```

import Tabs from '@theme/Tabs';

import TabItem from '@theme/TabItem';

有许多出色的向量存储选项，以下是一些免费、开源且完全在本地机器上运行的选项。请查看所有集成以获取许多出色的托管服务。

<Tabs>

  <TabItem value="chroma" label="Chroma" default>

 本教程使用在本地机器上作为库运行的 `chroma` 向量数据库。

```bash
pip install langchain-chroma
```

```python
from langchain_chroma import Chroma
db = Chroma.from_documents(documents, OpenAIEmbeddings())
```

  </TabItem>

  <TabItem value="faiss" label="FAISS">

 本教程使用利用 Facebook AI 相似性搜索 (FAISS) 库的 `FAISS` 向量数据库。

```bash
pip install faiss-cpu
```

```python
from langchain_community.vectorstores import FAISS
db = FAISS.from_documents(documents, OpenAIEmbeddings())
```

  </TabItem>

  <TabItem value="lance" label="Lance">

 本笔记本展示了如何使用与基于 Lance 数据格式的 LanceDB 向量数据库相关的功能。

```bash
pip install lancedb
```

```python
from langchain_community.vectorstores import LanceDB
import lancedb
db = lancedb.connect("/tmp/lancedb")
table = db.create_table(
    "my_table",
    data=[
        {
            "vector": embeddings.embed_query("Hello World"),
            "text": "Hello World",
            "id": "1",
        }
    ],
    mode="overwrite",
)
db = LanceDB.from_documents(documents, OpenAIEmbeddings())
```

  </TabItem>

</Tabs>

## 相似性搜索

所有向量存储都公开了 `similarity_search` 方法。这将接收传入的文档，创建其嵌入，并找到所有具有最相似嵌入的文档。

```python
query = "总统对 Ketanji Brown Jackson 说了什么"
docs = db.similarity_search(query)
print(docs[0].page_content)
```

<CodeOutputBlock lang="python">

```
    今晚。我呼吁参议院：通过《自由选举法》。通过《约翰·刘易斯选举权法》。而且在此期间，通过《披露法》，这样美国人就可以知道谁在资助我们的选举。
    今晚，我想向一个一生致力于为这个国家服务的人致敬：司法部长史蒂芬·布雷耶——一位陆军退伍军人、宪法学者，也是美国最高法院即将退休的法官。布雷耶法官，感谢您的服务。
    总统的最严肃的宪法责任之一是提名某人担任美国最高法院的法官。
    而我在 4 天前就做到了，当时我提名了联邦上诉法院法官 Ketanji Brown Jackson。她是我们国家顶尖的法律智慧之一，将继续延续布雷耶法官的卓越传统。
```

</CodeOutputBlock>

### 通过向量进行相似性搜索

还可以通过 `similarity_search_by_vector` 进行搜索，该方法接受嵌入向量作为参数，而不是字符串。

```python
embedding_vector = OpenAIEmbeddings().embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)
```

<CodeOutputBlock lang="python">

```
    今晚。我呼吁参议院：通过《自由选举法》。通过《约翰·刘易斯选举权法》。而且在此期间，通过《披露法》，这样美国人就可以知道谁在资助我们的选举。
    今晚，我想向一个一生致力于为这个国家服务的人致敬：司法部长史蒂芬·布雷耶——一位陆军退伍军人、宪法学者，也是美国最高法院即将退休的法官。布雷耶法官，感谢您的服务。
    总统的最严肃的宪法责任之一是提名某人担任美国最高法院的法官。
    而我在 4 天前就做到了，当时我提名了联邦上诉法院法官 Ketanji Brown Jackson。她是我们国家顶尖的法律智慧之一，将继续延续布雷耶法官的卓越传统。
```

</CodeOutputBlock>

